k近邻算法k近邻算法是经典的监督学习算法,我们这里主要介绍k近邻算法的基本内容和如何应用
算法原理k近邻算法的基本原理其实很简单
首先k近邻算法是一个分类算法,在我们进行分类之前,需要先定义“距离”,或者我们可以形象的理解为样本点之间的相似程度
训练集是已经准备好的,也已经完全分好了类别,接下来拿出每一个需要分类的测试点,找到训练集中和他最近的k个点,也就是最相似的k个点,如果这k个点都属于同一个类别,我们就有把握认为这个测试点也是这个类别的了
这个过程完成其实算法也就结束了,更加形象的说法可能是投票,比如说这个人有多少分像自己,然后取出最高的k个得分,如果这k个得分是同一类,就说明这个人是这一类的
k近邻算法是一种基于实例的学习,也是惰性学习的代表,没有显示的训练过程,因为我们一开始就没有对训练集做处理,而是直接使用,所以训练时间为0。与之对应的是急切学习,就是需要从训练集中建模
其次这个过程实际上是属于少数付出多数的,那么k值的选取和距离的定义就显得尤为重要
接下来我们会对这几个规则进行介绍
k值的选取正如我们之前所说,k值的选取对分类的准确性有很大影响,当k比较小时,模型对...
C++11简介C++11可以说是C语言演变成C++之后第二个重大的标准了,上一个重大的标准是C++98
C++11相较于C++98带来了数量非常非常多的变化,新特性,对C++03进行了很多修正,甚至让C++11变得很不“C++”
但是C++11能更好的用于系统开发和库开发,语法也更进一步泛化,简单化,稳定,安全
这里介绍一些比较实用的语法特性
统一的列表初始化需要注意这里的列表初始化和类的初始化列表不要混淆
花括号初始化在C++98中,我们可以使用花括号对数组和结构体进行统一的初始值的设定
12345678910111213struct S{ int _a; int _b;};int main(){ int arr[] = {1,2,3}; int arr[5] = {0}; S s = {1,2}; return 0;}
C++11就更像是把花括号括起来的数据作为了一种新的容器,把这种容器再作用于所有的内置类型和自定义类型的初始化,就像使用v...
线性回归线性回归(Linear Regression)模型是最简单的线性模型之一,很具代表性
概念我们在高中时代其实就学过使用最小二乘法进行线性回归分析
这实际上是统计学部分的内容,会有大量的自变量,或者说解释变量,还有就是对应的因变量,也就是输出结果,回归分析就是找出他们对应的关系,并且使用某个模型描述出来,这样一来给出新的变量,就能利用模型实现预测
这也就是我们一开始介绍机器学习说明的过程,给出输入和输出,找到一个模型T能够很好的拟合这些数据,从而使用T就能预测结果了
从几何层面,回归就是找到具有代表性的直线、曲线、甚至是面,来进行拟合
回归的种类有很多,一元和多元,那么一元其实就是线性回归。我们这里先讨论线性回归,而且我们假设因变量和自变量之间是满足线性关系的,也就是$y=w_0+w_1x$
这里的$w_0$和$w_1$我们称之为回归系数,我们需要拟合的,求出来的就是这两个权值,一个经典的示意图是这样的
这里的每一个点就是实际的数据,红色的线是我们拟合出来的,很容易可以看得到,有些点离线近,有些点离线远,我们使用残差(Residual)来描述这里的远和近,也就是...
sklearn与经典机器学习算法sklearn在学习的过程中,除了需要深入理解底层原理时,其实就需要避免重复的造轮子的过程,Python的强大的库就是一个非常好玩的功能
既能避免重复造轮子,还能快速的调用对应的api来使用功能
在机器学习领域的scikit-learn是一个非常常用的机器学习框架,我们将使用sklearn来说实现经典的机器学习算法
sklearn简介sklearn是一款07年至今的机器学习开源项目,基于NumPy和SciPy,提供了很多用于数据挖掘和分析的工具和接口
sklearn主打一个只做机器学习,不轻易支持新的算法,他的好处就是非常稳定
我们可以用几行代码就完成机器学习的七个步骤
数据处理读取数据并进行预处理,归一化、标准化、正则化等内容
分割数据数据随机分割成三组,训练集、验证集(可以没有)、测试集
训练模型针对选取好的特征,使用训练数据来构建模型,拟合数据,寻找最优的模型参数
这里的拟合数据主要是使用各种机器学习算法来学习数据中的特征,拟合出损失函数最小的参数
验证模型接入验证集给模型,我们将模型在验证集上的表现作为参数优化和选择的依据,常用的方法有Ho...
性能评估机器学习的模型有很多,我们在选择的时候就需要对各个模型进行对比,这时候就需要一个靠谱的标准,能够评估模型的性能
这里的性能不是说算的有多快,而是说预测的结果和真实情况进行比较的来的结果
误差在我们对训练的结果进行分析之前,首先需要思考模型训练过程中是否可能有误差的产生,因为这同样会影响结果和对模型选择产生比较大的影响
误差主要会出现在数据集的三个部分,分别是训练集、测试集、新样本
训练集——训练误差
测试集——测试误差
新样本——泛化误差
所谓的训练误差指的是训练集本身存在缺陷,从而模型提取的错误的特征信息,例如一个只认识红色苹果的模型,遇到绿色苹果时,他就不认为这是苹果了
一般情况下拿到一个数据集,会将其分成两部分,分别作为训练集和测试集,那么对于训练完成的模型,此时测试集也相当于是一个新样本
训练模型的时候,一开始训练误差和测试误差都会比较高,但是训练次数越多,训练误差会越来越小,但是测试误差可能会变大,而且模型的复杂度也会随之提升
这样的现象我们分别称之为欠拟合和过拟合
欠拟合和过拟合欠拟合的概念很好理解,其实就是由于数据量不够大,模型的准确率不够多,也就是一开...
非监督学习与监督学习相反,非监督学习的训练数据集是完全没有标签的数据,他本质上所做的工作都是聚类的
给定数据之后,聚类能从中学习到什么,就完全取决于数据本身的特性的,简单说就是自动给数据贴标签
比较有名的非监督学习蒜贩有K均值聚类(K-Means Clustering)、层次聚类(Hierarchical Clustering)、主成分分析(Principal Components Analysis,PCA)、DBSCAN、深度信念网络(Deep Belief Net)等
半监督学习半监督学习其实是使用最多的一种了,就像我们人生的学习过程一样,不是所有的东西都有人来教,总有需要自己去理解总结的时候
他的形式化的定义如下
给定一个来自于某个位置分布的有标记实例集合${(x_1,y_1),(x_2,y_2),\dots,(x_k,y_k)}$这里$x_i$是输入数据,而$y_i$是标签;然后还有一个未标记的示例集合$U={x_{k+1},x_{k+2},\dots,x_{k+u}}$那么这里的u就是未标记的数据个数
我们希望模型通过学习得到某个函数,通过他能够准确的对未标记...
机器学习初步什么是机器学习我们人类学习的过程就像是在理解一个知识并且能够运用这种知识,而理解知识过程本身就是一种改善提高自我的过程。这里面最重要的其实就是从过往的,已有的数据中,提取知识,并且能够运用
机器学习的三个步骤在人类学习的过程中,例如学习将实物苹果和文字“苹果”做对应,我们通过观看苹果的图片或者实物,提取出共同的特征,例如都有类似红色的颜色,顶部和底部都有凹陷的窝,一般有梗,叶子是绿色的等等一系列特征,再将这些特征与苹果这两个文字联系起来,就完成了从实物到文字的这样一个映射(学习过程)
那么对于机器学习也是一样的,我们有特定输入,预期输出,处理函数
对于特定输入,其实就是苹果的图片或者实物,但是对于计算机而言,他是无法观看这些实物的影像的。因此我们考虑将这些影响转化为具有特征值的向量空间,例如使用灰度矩阵来表示图片
预期输出也就是我们最终学习到的“苹果”两个字,也就是学习之后的结果
而处理函数就是我们的大脑
每一个具体的输入称之为实例(instance),由特征向量(feature vector)构成,所有特征向量存在的空间称之为特征空间(feature space)
...
布隆过滤器我们在上一篇中主要说的是位图,是用于判断整形是否存在的一种应用,但是他不好的地方就是只能判断整形了,如果是字符串的话就难再应用了
在之前哈希表中,我们使用了一些哈希函数来将字符串转化成整形,再存入哈希表
这里我们是否可以使用同样的方法呢
其实我们讲,可以但是还不够,因为相似的字符串很容易就会产生哈希冲突,本质上来说还是因为字符串的数量太庞大,远远超出了整形能承受的范围,从而形成一种多对少的效果,产生了冲突
那么对于这样的冲突,也不能直接存字符串,因为使用位图本身就是为了节省空间的
这时候就有人想到了一个方法,既然一个关键字(哈希地址)容易产生冲突,那么我如果使用两种不同的哈希函数,每一个字符串对应两个哈希地址,只有当两个哈希地址都是1的时候,我们才认为该字符串是已经存在的
但是这种存在依旧是“不可靠”的,在数据量特别巨大的时候,可能是别的字符串,恰好占用了这两个地址,此时就会误判,但是判断不存在的时候就是可靠的了,因为只要有一个是0,就说明这个字符串并不存在
这也就是为什么我们称之为过滤器,简单说一种应用就是用户注册时不允许重复名称,当我们查询时,发现不存在,这时就不需...